<?php
/**
 * <b>RUBIK IT Solution & Development ltd.</b>
 *
 * PROJECT		: Rubik Ultimate Framework
 * @version 	: 1.1
 * COPYRIGHT    : 2008
 * ------------------------------------------------------
 * 
 * Created on	:  Jun 15, 2008
 * 
 */

// no direct access
defined ( '_FW_EXEC' ) or die ( 'Restricted access' );

/**
 * @version		$Id: Object.class.php 118 2009-03-05 02:14:07Z sanglt $
 * @package		Joomla.Framework
 * @subpackage	Base
 * @copyright	Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * See COPYRIGHT.php for copyright notices and details.
 */
// Define for Joomla library
define ( 'JPATH_BASE', SYS_ROOT_PATH );

/**
 * Object class, allowing __construct in PHP4.
 *
 * @author		Johan Janssens <johan.janssens@joomla.org>
 * @package		Joomla.Framework
 * @subpackage	Base
 * @since		1.5
 */
class JObject {
	
	/**
	 * An array of errors
	 *
	 * @var		array of error messages or JExceptions objects
	 * @access	protected
	 * @since	1.0
	 */
	var $_errors = array ();
	
	/**
	 * A hack to support __construct() on PHP 4
	 *
	 * Hint: descendant classes have no PHP4 class_name() constructors,
	 * so this constructor gets called first and calls the top-layer __construct()
	 * which (if present) should call parent::__construct()
	 *
	 * @access	public
	 * @return	Object
	 * @since	1.5
	 */
	function JObject() {
		$args = func_get_args ();
		call_user_func_array ( array (&$this, '__construct' ), $args );
	}
	
	/**
	 * Class constructor, overridden in descendant classes.
	 *
	 * @access	protected
	 * @since	1.5
	 */
	function __construct() {
	}
	
	/**
	 * Returns a property of the object or the default value if the property is not set.
	 *
	 * @access	public
	 * @param	string $property The name of the property
	 * @param	mixed  $default The default value
	 * @return	mixed The value of the property
	 * @see		getProperties()
	 * @since	1.5
	 */
	function get($property, $default = null) {
		if (isset ( $this->$property )) {
			return $this->$property;
		}
		return $default;
	}
	
	/**
	 * Returns an associative array of object properties
	 *
	 * @access	public
	 * @param	boolean $public If true, returns only the public properties
	 * @return	array
	 * @see		get()
	 * @since	1.5
	 */
	function getProperties($public = true) {
		$vars = get_object_vars ( $this );
		
		if ($public) {
			foreach ( $vars as $key => $value ) {
				if ('_' == substr ( $key, 0, 1 )) {
					unset ( $vars [$key] );
				}
			}
		}
		
		return $vars;
	}
	
	/**
	 * Get the most recent error message
	 *
	 * @param	integer	$i Option error index
	 * @param	boolean	$toString Indicates if JError objects should return their error message
	 * @return	string	Error message
	 * @access	public
	 * @since	1.5
	 */
	function getError($i = null, $toString = true) {
		// Find the error
		if ($i === null) {
			// Default, return the last message
			$error = end ( $this->_errors );
		} else if (! array_key_exists ( $i, $this->_errors )) {
			// If $i has been specified but does not exist, return false
			return false;
		} else {
			$error = $this->_errors [$i];
		}
		
		// Check if only the string is requested
		if (RError::isError ( $error ) && $toString) {
			return $error->toString ();
		}
		
		return $error;
	}
	
	/**
	 * Return all errors, if any
	 *
	 * @access	public
	 * @return	array	Array of error messages or JErrors
	 * @since	1.5
	 */
	function getErrors() {
		return $this->_errors;
	}
	
	/**
	 * Check if has error
	 *
	 * @return boolean
	 */
	function hasError() {
		return ! empty ( $this->_errors );
	}
	
	/**
	 * Modifies a property of the object, creating it if it does not already exist.
	 *
	 * @access	public
	 * @param	string $property The name of the property
	 * @param	mixed  $value The value of the property to set
	 * @return	mixed Previous value of the property
	 * @see		setProperties()
	 * @since	1.5
	 */
	function set($property, $value = null) {
		$previous = isset ( $this->$property ) ? $this->$property : null;
		$this->$property = $value;
		return $previous;
	}
	
	/**
	 * Set the object properties based on a named array/hash
	 *
	 * @access	protected
	 * @param	$array  mixed Either and associative array or another object
	 * @return	boolean
	 * @see		set()
	 * @since	1.5
	 */
	function setProperties($properties) {
		$properties = ( array ) $properties; //cast to an array
		

		if (is_array ( $properties )) {
			foreach ( $properties as $k => $v ) {
				$this->$k = $v;
			}
			
			return true;
		}
		
		return false;
	}
	
	/**
	 * Add an error message
	 *
	 * @param	string $error Error message
	 * @access	public
	 * @since	1.0
	 */
	function setError($error) {
		array_push ( $this->_errors, $error );
	}
	
	/**
	 * Object-to-string conversion.
	 * Each class can override it as necessary.
	 *
	 * @access	public
	 * @return	string This name of this class
	 * @since	1.5
	 */
	function toString() {
		return get_class ( $this );
	}
	
	/**
	 * Legacy Method, use {@link JObject::getProperties()}  instead
	 *
	 * @deprecated as of 1.5
	 * @since 1.0
	 */
	function getPublicProperties() {
		return $this->getProperties ();
	}
	
	/**
	 * Get all error Messages
	 *
	 * @param string $breaker
	 * @return string
	 */
	function getAllErrorsMsg($breaker = "\n<br/>") {
		$result = "";
		$count = count ( $this->_errors );
		for($i = 0; $i < $count; $i ++) {
			$result .= $this->getError ( $i ) . $breaker;
		}
		return $result;
	}
	
	/**
	 * Clear all error in this object
	 */
	function clearAllErrors() {
		$this->_errors = array();
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

/**
 * Object class, allowing __construct in PHP4.
 *
 */
class Object extends JObject {
	/**
	 * Get the hash value of current object
	 */
	function hash() {
		$vars = get_object_vars ( $this );
		$hash = '';
		foreach ( $vars as $key => $value ) {
			$hash .= "{$key}->{$value}";
		}
		
		return md5 ( $hash );
	}
}
